package ai;

import java.util.ArrayList;

import junit.framework.TestCase;

public class AIPlayerTest extends TestCase {

	public void testNextMove() {
		DefaultAIPlayer ai = new DefaultAIPlayer(true);
		char[][] test1 = {{'.','X','X','X','X','X','X','.'},
						  {'O','.','.','.','.','.','.','O'},
						  {'O','.','.','.','.','.','.','O'},
						  {'O','.','.','.','.','.','.','O'},
						  {'O','.','.','.','.','.','.','O'},
						  {'O','.','.','.','.','.','.','O'},
						  {'O','.','.','.','.','.','.','O'},
						  {'.','X','X','X','X','X','X','.'}};
		ai.board = test1;
		ai.countPieces();
		ai.CalculerMinMaxAB(4);
		assertTrue(1==0);
	}
	
	public void testIsMoveValid(){
		DefaultAIPlayer ai = new DefaultAIPlayer(true);
		char[][] test1 = {{'.','X','X','X','.','X','X','.'},
						  {'O','.','.','.','.','.','.','O'},
						  {'O','.','.','.','.','.','.','O'},
						  {'O','.','.','.','X','.','.','O'},
						  {'O','.','.','.','.','.','.','O'},
						  {'O','.','.','.','.','.','.','O'},
						  {'O','.','.','.','.','.','.','O'},
						  {'.','X','X','X','X','X','X','.'}};
		ai.board = test1;
		int[] move = {3,4,1,4};
		assertTrue(ai.isMoveValid(ai.ConvertMoveToString(move)));
		move[2] = 5;
		assertTrue(ai.isMoveValid(ai.ConvertMoveToString(move)));
		
		char[][] test2 = {{'.','X','X','X','X','X','X','.'},
				  		  {'O','.','.','.','.','.','.','O'},
				  		  {'O','.','.','.','.','.','.','O'},
				  		  {'O','X','.','.','.','.','.','O'},
				  		  {'O','.','.','.','.','.','.','O'},
				  		  {'O','.','.','.','.','.','.','O'},
				  		  {'O','.','.','.','.','.','.','O'},
				  		  {'.','X','X','X','X','X','X','.'}};
		int[] move2 = {3,1,6,4};
		ai.board = test2;
		assertTrue(ai.isMoveValid(ai.ConvertMoveToString(move2)));
		char[][] test2b = {{'.','X','X','X','X','X','X','.'},
		  		  		   {'O','.','.','.','.','.','.','O'},
		  		  		   {'O','.','.','.','.','.','.','O'},
		  		  		   {'O','.','.','.','.','.','.','O'},
		  		  		   {'O','.','.','.','.','.','.','O'},
		  		  		   {'O','.','.','.','.','.','.','O'},
		  		  		   {'O','.','.','.','X','.','.','O'},
		  		  		   {'.','X','X','X','X','X','X','.'}};
		ai.board = test2b;
		int[] move2b = {6,4,3,1};
		assertTrue(ai.isMoveValid(ai.ConvertMoveToString(move2b)));
		
		char[][] test3 = {{'.','X','X','X','X','X','X','.'},
		  		  		  {'O','.','.','X','.','.','.','O'},
		  		  		  {'O','.','.','.','.','.','.','O'},
		  		  		  {'O','.','.','.','.','.','.','O'},
		  		  		  {'O','.','.','.','.','.','.','O'},
		  		  		  {'O','.','.','.','.','.','.','O'},
		  		  		  {'O','.','.','.','.','.','.','O'},
		  		  		  {'.','X','X','X','X','X','X','.'}};
		int[] move3 = {1,3,4,6};
		ai.board = test3;
		assertTrue(ai.isMoveValid(ai.ConvertMoveToString(move3)));
		char[][] test3b = {{'.','X','X','X','X','X','X','.'},
		  		  		  {'O','.','.','.','.','.','.','O'},
		  		  		  {'O','.','.','.','.','.','.','O'},
		  		  		  {'O','.','.','.','.','.','.','O'},
		  		  		  {'O','.','.','.','.','.','X','O'},
		  		  		  {'O','.','.','.','.','.','.','O'},
		  		  		  {'O','.','.','.','.','.','.','O'},
		  		  		  {'.','X','X','X','X','X','X','.'}};
		ai.board = test3b;
		int[] move3b = {4,6,1,3};
		assertTrue(ai.isMoveValid(ai.ConvertMoveToString(move3b)));
		
		char[][] test4 = {{'.','X','X','X','X','X','X','.'},
		  		  		  {'O','.','.','.','.','.','.','O'},
		  		  		  {'.','.','.','.','.','.','.','O'},
		  		  		  {'O','.','.','.','.','.','.','O'},
		  		  		  {'O','.','.','.','.','.','.','O'},
		  		  		  {'O','.','.','.','.','.','.','O'},
		  		  		  {'O','.','.','.','X','.','.','O'},
		  		  		  {'.','X','X','X','X','.','X','.'}};
		int[] move4 = {6,4,7,5};
		ai.board = test4;
		assertTrue(ai.isMoveValid(ai.ConvertMoveToString(move4)));
		char[][] test4b = {{'.','X','X','X','X','X','X','.'},
		  		  		   {'O','.','.','.','.','.','.','O'},
		  		  		   {'.','.','.','.','.','.','.','O'},
		  		  		   {'O','.','.','.','.','.','.','O'},
		  		  		   {'O','.','.','.','.','.','.','O'},
		  		  		   {'O','.','.','.','.','.','.','O'},
		  		  		   {'O','.','.','.','.','.','.','O'},
		  		  		   {'.','X','X','X','X','X','X','.'}};
		ai.board = test4b;
		int[] move4b = {7,5,6,4};
		assertTrue(ai.isMoveValid(ai.ConvertMoveToString(move4b)));
		
		char[][] test5 = {{'.','X','X','X','X','X','X','.'},
						  {'O','.','.','.','.','.','.','O'},
						  {'O','.','.','.','.','.','.','O'},
						  {'O','.','.','.','.','.','.','O'},
						  {'O','X','.','.','.','.','.','O'},
						  {'O','.','.','.','.','.','.','O'},
						  {'O','.','.','.','.','.','.','O'},
						  {'.','X','X','X','X','.','X','.'}};
		int[] move5 = {4,1,1,4};
		ai.board = test5;
		assertTrue(ai.isMoveValid(ai.ConvertMoveToString(move5)));
		
		char[][] test5b = {{'.','X','X','X','X','X','X','.'},
				  		   {'O','.','.','.','X','.','.','O'},
				  		   {'O','.','.','.','.','.','.','O'},
				  		   {'O','.','.','.','.','.','.','O'},
				  		   {'O','.','.','.','.','.','.','O'},
				  		   {'O','.','.','.','.','.','.','O'},
				  		   {'O','.','.','.','.','.','.','O'},
				  		   {'.','X','X','X','X','.','X','.'}};
		ai.board = test5b;
		int[] move5b = {1,4,4,1};
		assertTrue(ai.isMoveValid(ai.ConvertMoveToString(move5b)));
		
		char[][] test6 = {{'.','X','X','X','X','X','X','.'},
				  		  {'O','.','.','X','.','.','.','O'},
				  		  {'O','.','.','.','.','.','.','O'},
				  		  {'O','.','.','.','.','.','.','O'},
				  		  {'O','.','.','.','.','.','.','O'},
				  		  {'O','.','.','.','.','.','.','O'},
				  		  {'O','.','.','.','.','.','.','O'},
				  		  {'.','X','X','X','X','X','X','.'}};
		int[] move6 = {1,3,3,1};
		ai.board = test6;
		assertFalse(ai.isMoveValid(ai.ConvertMoveToString(move6)));
		char[][] test6b = {{'.','X','X','X','X','X','X','.'},
		  		  		   {'O','.','.','.','.','.','.','O'},
		  		  		   {'O','.','.','.','.','.','.','O'},
		  		  		   {'O','X','.','.','.','.','.','O'},
		  		   		   {'O','.','.','.','.','.','.','O'},
		  		   		   {'O','.','.','.','.','.','.','O'},
		  		  		   {'O','.','.','.','.','.','.','O'},
		  		  		   {'.','X','X','X','X','.','X','.'}};
		ai.board = test6b;
		int[] move6b = {3,1,1,3};
		assertFalse(ai.isMoveValid(ai.ConvertMoveToString(move6b)));
	}
	
	public void testConvertMoveToCoords(){
		DefaultAIPlayer ai = new DefaultAIPlayer(true);
		int[] move = ai.ConvertMoveToCoords(" A8 - A8");
		assertTrue(move[0] == 0 && move[1] == 7 && move[2] == 0 && move[3] == 7);
	}
	
	public void testGenerateNextMove(){
		DefaultAIPlayer ai = new DefaultAIPlayer(true);
		ArrayList<int[]> moves = ai.generateMoves('X');
		for(int[] m : moves){
			for(int i : m){
				System.out.print(i);
			}
			System.out.println(":"+ai.ConvertMoveToString(m));
		}
	}
	
	public void testCompute(){
		DefaultAIPlayer ai = new DefaultAIPlayer(true);
		System.out.println(ai.nextMove);
		ai.compute();
		try {
			Thread.sleep(4000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		ai.stopComputing();
		System.out.println(ai.nextMove);
	}
	
	public void testCalculerMinMaxAB(){
		DefaultAIPlayer ai = new DefaultAIPlayer(true);
		char[][] test1 = {{'.','X','X','X','X','X','X','.'},
						  {'O','.','.','.','.','.','.','O'},
						  {'O','.','.','.','.','.','.','O'},
						  {'O','.','.','.','.','.','.','O'},
						  {'O','.','.','.','.','.','.','O'},
						  {'O','.','.','.','.','.','.','O'},
						  {'O','.','.','.','.','.','.','O'},
						  {'.','X','X','X','X','X','X','.'}};
		ai.board = test1;
		String move = ai.CalculerMinMaxAB(4);
		System.out.println(move);
		System.out.println(ai.charPrint(ai.board));

		ai = new DefaultAIPlayer(true);
		char[][] test2 = {{'.','X','O','X','X','X','X','.'},
						  {'O','.','.','.','.','.','.','O'},
						  {'X','.','.','.','.','.','.','O'},
						  {'O','.','.','.','.','.','.','O'},
						  {'O','.','.','.','.','.','.','O'},
						  {'O','.','.','.','.','.','.','O'},
						  {'O','.','.','.','.','.','.','O'},
						  {'.','X','X','X','X','X','X','.'}};
		ai.board = test1;
		move = ai.CalculerMinMaxAB(4);
		System.out.println(move);
		System.out.println(ai.charPrint(ai.board));
		assertTrue(1==0);
	}
	
	public void testApplyMove(){
		DefaultAIPlayer ai = new DefaultAIPlayer(true);

		ai.playMove("C8 - A6");
		System.out.println(ai.charPrint(ai.board));
		ai.playMove("A2 - C2");
		System.out.println(ai.charPrint(ai.board));
		ai.playMove("A6 - C4");
		System.out.println(ai.charPrint(ai.board));
	}

}
